﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.kabg
    A_B_G滤波
    void kabg(int n, double x[], double t, double a, double b, double c, double y[])
    参数 n: 量测数据点数。
    参数 x: x[n]n个等间隔点上的量测值。
    参数 t: 采样周期。
    参数 a: 滤波器结构参数Alpha。
    参数 b: 滤波器结构参数Beta。
    参数 c: 滤波器结构参数Gamma。
    参数 y: y[n]返回n个等间隔点上的滤波估值。
    */

    public static string drive_kabg()
    {
        Random rnd = new Random();
        int i;
        double[] x = new double[150];
        double[] y = new double[150];
        double[] z = new double[150];
        double a, b, c, dt, t;

        a = 0.271;
        b = 0.0285;
        c = 0.0005;
        dt = 0.04;
        // 产生150个均值为0，方差为0.25的高斯白噪声
        for (i = 0; i < 150; i++)
            y[i] = rnd.NextDouble() * 0.5;
        for (i = 0; i <= 149; i++)
        {
            t = (i + 1) * dt;
            z[i] = 3.0 * t * t - 2.0 * t + 5.0;
            x[i] = z[i] + y[i];
        }
        gl.kabg(150, x, dt, a, b, c, y);



        string rs = "";
        rs += gl.html_table("x", x);
        rs += gl.html_table("y", y);
        rs += gl.html_table("z", z);

        double[,] w = new double[30, 4];
        int j = 0;
        for (i = 0; i <= 149; i = i + 5, j++)
        {
            t = (i + 1) * dt;

            w[j, 0] = t;
            w[j, 1] = x[i];
            w[j, 2] = y[i];
            w[j, 3] = z[i];

            // cout <<"t=" <<t <<"  x(t)=" <<setw(10) <<x[i] <<"  y(t)=" << setw(10) << y[i] << "  z(t)=" << setw(10) << z[i] << endl;
        }
        rs += gl.html_table("w", w);
        return rs;
    }
}